package iss.java;

import java.io.*;
import java.util.Random;
import java.util.Scanner;

public class Main
{

    public static void main(String[] args)
    {
        try
        {
            /*
             * 要求1测试
             * 从txt文件中读取一个含有“学生姓名、学号、语文、数学、英语、物理、化学”字段的学生成绩表
             * 并且计算出来每个人的总评成绩和每门课平均成绩，最终把所有结果输出到控制台
             */
            File gradeList_1 = new File("data/grades_1.txt");
            File nameList = new File("data/nameList.txt");

            /*读取名单，得到名单中的人数*/
            Scanner input_0 = new Scanner(nameList);
            // 记录名单人数
            int count = 0;
            while(input_0.hasNextLine())
            {
                input_0.nextLine();
                count++;
            }

            // 读取最初的五人成绩单
            Scanner input_1 = new Scanner(gradeList_1);
            // 学生成绩单的容量为名单人数+最初的五人
            StudentList list1 = new StudentList(count + 5);

            // 忽略第一行的内容
            input_1.nextLine();

            /*读取txt中信息并存储至list成绩单中*/
            while(input_1.hasNextLine())
            {
                list1.addStudent(input_1.next(), input_1.next(), input_1.nextDouble(), input_1.nextDouble(),
                        input_1.nextDouble(), input_1.nextDouble(), input_1.nextDouble());
            }

            // 输出list中的信息
            list1.showStudentInConsole();

            /*
             * 要求2测试
             * 自制学生名册，存为txt文件。从txt文件中读取学生的姓名和学号，把这些姓名添加到第一步的成绩单中。
             * 在成绩单中，随机生成[50, 100]之间的数，填写到第一步的成绩单中。
             * 计算每门课的平均成绩。
             * 计算每个学生的总成绩。
             * 按照总成绩对成绩单重新排序。
             * 把排序后的成绩输出为txt或csv文件。
             */
            Scanner input_2 = new Scanner(nameList);

            /*读取名单中的信息,录入到list成绩单中,并录入随机生成的成绩*/
            Random r = new Random(System.currentTimeMillis());
            while(input_2.hasNextLine())
            {
                list1.addStudent(input_2.next(), input_2.next(),
                        Main.getRandomNum(r),
                        Main.getRandomNum(r),
                        Main.getRandomNum(r),
                        Main.getRandomNum(r),
                        Main.getRandomNum(r));
            }

            // 计算每门课的平均成绩
            list1.calculateAverage();

            // 按照总成绩对成绩单重新排序
            list1.mergeSort(0, list1.get_students().length - 1);

            // 格式化输出成绩单
            PrintWriter output = new PrintWriter(new File("data/orderedGrades.txt"));

            // 输出第一栏
            output.println("姓名\t\t" + "学号\t\t\t" + "语文\t" + "数学\t"
                    + "英语\t" + "物理\t" + "化学\t" + "总成绩\t");

            // 输出学生信息
            for(int i = 0; i < list1.get_students().length - 1; i++)
            {
                output.print(list1.get_students()[i].get_name() + "\t\t");
                output.print(list1.get_students()[i].get_id() + "\t\t");
                for(double j : list1.get_students()[i].get_grades())
                {
                    output.print((int)j + "\t\t  ");
                }
                // 输出总成绩
                output.print((int)(list1.get_students()[i].get_totalMark()) + "\t\t");
                output.println();
            }
            // 输出平均成绩
            output.println("语文平均成绩：" + list1.get_averageGrades()[0]);
            output.println("数学平均成绩：" + list1.get_averageGrades()[1]);
            output.println("英语平均成绩：" + list1.get_averageGrades()[2]);
            output.println("物理平均成绩：" + list1.get_averageGrades()[3]);
            output.println("化学平均成绩：" + list1.get_averageGrades()[4]);

            output.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static int getRandomNum(Random r)
    {
        int result;
        while (true)
        {
            result = (int)(Math.sqrt(50) * r.nextGaussian() + 80);
            if(result >= 50 && result <= 100)
            {
                return  result;
            }
        }
    }
}
